package lib.bone.system.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.lang.Validator;
import lib.bone.common.constant.ResponseCodeConst;
import lib.bone.common.core.domain.PageResultDTO;
import lib.bone.common.core.domain.ResponseDTO;
import lib.bone.common.exception.BusinessException;
import lib.bone.system.constant.MenuConst;
import lib.bone.system.dao.SysMenuDAO;
import lib.bone.system.dao.SysRoleMenuDAO;
import lib.bone.system.domain.dto.menu.MenuAddDTO;
import lib.bone.system.domain.dto.menu.MenuUpdateDTO;
import lib.bone.system.domain.entity.SysMenu;
import lib.bone.system.domain.vo.MetaVO;
import lib.bone.system.domain.vo.RouterVO;
import lib.bone.system.service.SysMenuService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * @Author : kindear
 * @Date : 2021-12-23
 */
@Slf4j
@Service
public class SysMenuServiceImpl implements SysMenuService {
    @Autowired
    SysMenuDAO sysMenuDAO;

    @Autowired
    SysRoleMenuDAO sysRoleMenuDAO;

    @Override
    public SysMenu saveOne(SysMenu sysMenu) {
        if (Validator.isNotEmpty(sysMenu.getId())){
            throw new BusinessException(ResponseCodeConst.ERROR_PARAM);
        }
        return sysMenuDAO.save(sysMenu);
    }

    @Override
    public SysMenu updateOne(SysMenu sysMenu) {
        if (Validator.isEmpty(sysMenu.getId())){
            throw new BusinessException(ResponseCodeConst.ERROR_PARAM);
        }
        return sysMenuDAO.save(sysMenu);
    }

    @Override
    public PageResultDTO<SysMenu> getAll(Pageable pageable, Example<SysMenu> example) {
        return null;
    }

    @Override
    public ResponseDTO deleteById(Long id) {
        /** 判断是否存在该ID **/
        Optional<SysMenu> sysMenuOp = sysMenuDAO.findById(id);
        if(!sysMenuOp.isPresent()){
            return ResponseDTO.wrap(ResponseCodeConst.NOT_FOUND,"菜单ID:["+id+"]无对应信息存在");
        }
        sysMenuDAO.deleteById(id);
        return ResponseDTO.succMsg("删除菜单成功");
    }


    @Override
    public Optional<SysMenu> getById(Long id) {
        return sysMenuDAO.findById(id);
    }

//
//
//    public ResponseDTO saveOne(MenuAddDTO menuAddDTO) {
//        //获取父ID
//        Long parentId = menuAddDTO.getParentId();
//        Optional<SysMenu> parentSysMenuOp = sysMenuDAO.findById(parentId);
//        //重复性校验
//        if(Validator.isNotEmpty(menuAddDTO.getComponent()) && Validator.isNotEmpty(menuAddDTO.getPath())){
//            Optional<SysMenu> sameMenuOp = sysMenuDAO.findByPathOrComponent(
//                    menuAddDTO.getPath(),
//                    menuAddDTO.getComponent()
//            );
//            String errMsg = "";
//        }
//        if(parentSysMenuOp.isPresent()){
//            SysMenu parentMenu = parentSysMenuOp.get();
//            SysMenu sysMenu = new SysMenu();
//            BeanUtil.copyProperties(menuAddDTO,sysMenu, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
//            sysMenu.setParent(parentMenu);
//            //构建名称
//            sysMenu.setParentName(parentMenu.getMenuName());
//            return ResponseDTO.succData(sysMenuDAO.save(sysMenu));
//        }else {
//            SysMenu sysMenu = new SysMenu();
//            BeanUtil.copyProperties(menuAddDTO,sysMenu, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
//            return ResponseDTO.succData(sysMenuDAO.save(sysMenu));
//        }
//    }


//    public ResponseDTO updateOne(MenuUpdateDTO menuUpdateDTO) {
//        if(Validator.isEmpty(menuUpdateDTO.getId())){
//            return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM,"参数ID不可为空");
//        }
//        Optional<SysMenu> menuOp = sysMenuDAO.findById(menuUpdateDTO.getId());
//        if(menuOp.isPresent()){
//            SysMenu sysMenu = menuOp.get();
//            BeanUtil.copyProperties(menuUpdateDTO,sysMenu,CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
//            //父级组件不存在
//            if(Validator.isNotEmpty(sysMenu.getParent()) && !sysMenu.getParent().getId().equals(menuUpdateDTO.getParentId())){
//                Optional<SysMenu> parentOp = getById(menuUpdateDTO.getId());
//                parentOp.ifPresent(sysMenu::sourceParent);
//            }
//
//
//            return ResponseDTO.succData(sysMenuDAO.save(sysMenu));
//        }else {
//            return ResponseDTO.wrap(ResponseCodeConst.NOT_FOUND,"ID:["+menuUpdateDTO.getId()+"]对应菜单不存在!");
//        }
//    }

//    @Override
//    public Optional<SysMenu> getOne(Long menuId) {
//        return sysMenuDAO.findById(menuId);
//    }

//    @Override
//    public ResponseDTO deleteOneMenu(Long menuId) {
//        /** 判断是否存在该ID **/
//        Optional<SysMenu> sysMenuOp = getById(menuId);
//        if(!sysMenuOp.isPresent()){
//            return ResponseDTO.wrap(ResponseCodeConst.NOT_FOUND,"菜单ID:["+menuId+"]无对应信息存在");
//        }
//        sysMenuDAO.deleteById(menuId);
//        return ResponseDTO.succMsg("删除菜单成功");
//    }

    @Override
    public List<SysMenu> getMenuByIdList(List<Long> menuIdList) {
        return sysMenuDAO.findByIdIn(menuIdList);
    }

    /**
     * 构建菜单路由
     */
    @Override
    public List<RouterVO> buildMenus(List<SysMenu> menus) {
        List<RouterVO> routers = new LinkedList<RouterVO>();

        for(SysMenu menu:menus){
            RouterVO routerVO = new RouterVO();
            // 是否隐藏对应组件
            //routerVO.setIsHidden(menu.getVisible().equals(1));
            routerVO.setName(menu.getMenuName());
            /**
             * 配置路径
             */
            if(menu.getMenuType().equals(MenuConst.TYPE_DIR)){
                routerVO.setPath("/"+menu.getPath());
            }else {
                routerVO.setPath(menu.getPath());
            }

            /**
             * 如果是非空
             */
            if(Validator.isNotEmpty(menu.getComponent())){
                routerVO.setComponent(menu.getComponent());
            }else {
                routerVO.setComponent("Layout");
            }

            /**
             * 构建 Meta
             */
            MetaVO meta = new MetaVO();
            meta.setIcon(menu.getIcon());
            meta.setTitle(menu.getMenuName());
            // 配置 是否缓存
            //metaVO.setNoCache(menu.getIsCache().equals(0));
            routerVO.setMeta(meta);
            Set<SysMenu> cmenus = menu.getChildren();
            if (Validator.isNotEmpty(cmenus) && cmenus.size() > 0 && menu.getMenuType().equals(MenuConst.TYPE_DIR)) {
                routerVO.setAlwaysShow(true);
                routerVO.setRedirect("noRedirect");
                //构建子路由
                routerVO.setChildren(buildMenus(new ArrayList<>(cmenus)));
            }
            routers.add(routerVO);
        }

        return routers;
    }

    @Override
    public List<RouterVO> buildMenus(List<SysMenu> menus, List<Long> menuIds) {
        List<RouterVO> routers = new LinkedList<RouterVO>();

        for(SysMenu menu:menus){
            RouterVO routerVO = new RouterVO();
            // 是否隐藏对应组件
            //routerVO.setIsHidden(menu.getVisible().equals(1));
            routerVO.setName(menu.getMenuName());
            /**
             * 配置路径
             */
            if(menu.getMenuType().equals(MenuConst.TYPE_DIR)){
                routerVO.setPath("/"+menu.getPath());
            }else {
                routerVO.setPath(menu.getPath());
            }

            /**
             * 如果是非空
             */
            if(Validator.isNotEmpty(menu.getComponent())){
                routerVO.setComponent(menu.getComponent());
            }else {
                routerVO.setComponent("Layout");
            }

            /**
             * 构建 Meta
             */
            MetaVO meta = new MetaVO();
            meta.setIcon(menu.getIcon());
            meta.setTitle(menu.getMenuName());
            // 配置 是否缓存
            //metaVO.setNoCache(menu.getIsCache().equals(0));
            routerVO.setMeta(meta);
            Set<SysMenu> cmenus = menu.getChildren();
            if (Validator.isNotEmpty(cmenus) && cmenus.size() > 0 && menu.getMenuType().equals(MenuConst.TYPE_DIR)) {
                routerVO.setAlwaysShow(true);
                routerVO.setRedirect("noRedirect");
                //构建子路由
                routerVO.setChildren(buildMenus(new ArrayList<>(cmenus),menuIds));
            }
            if (menu.getMenuType().equals(MenuConst.TYPE_DIR) && null != routerVO.getChildren() && routerVO.getChildren().size() !=0){
                //log.info("目录{}创建",menu.getMenuName());
                //如果是目录
                routers.add(routerVO);
            } else if (menu.getMenuType().equals(MenuConst.TYPE_MENU) && menuIds.contains(menu.getId())){
                //log.info("菜单{}创建",menu.getMenuName());
                //如果是菜单
                routers.add(routerVO);
            }

        }

        return routers;
    }

    @Override
    public List<SysMenu> buildMenuTree(List<SysMenu> menus) {
        return menus;
    }

    @Override
    public List<SysMenu> findByParent(SysMenu parent) {
        if(Validator.isEmpty(parent)){
            return sysMenuDAO.findByParentIsNull();
        }else {
            Example<SysMenu> example = Example.of(parent);
            return sysMenuDAO.findAll(example);
        }
        //return null;
    }

}
